/*
 * Cliente.java
 *
 * Created on 14 de Maio de 2007, 17:11
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package pt.iscte.dcti.es.rhplus.utilizador;

import java.sql.SQLException;
import java.util.Date;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.LinkedList;

import pt.iscte.dcti.es.rhplus.sistema.CodigoPostal;
import pt.iscte.dcti.es.rhplus.sistema.persistencia.AcessoBD;

/**
*
* @author Gustavo Cabral
* @author Helena Monteiro
* @author Joao Catarino
* @author Tiago Moreiras
*/
public abstract class Cliente extends Utente {

	/** Creates a new instance of Cliente */
	public Cliente(final int id_pessoa, final String nome, final char sexo, final int bi, final Date data_de_nascimento, final int nif,
			final String email, final int telefone, final int telemovel, final String morada, final String grupo_sanguineo,
			final CodigoPostal codigo_postal, final LinkedList<TratamentoPassado> lista_de_tratamentos_passados,
			LinkedList<DoencaPassada> lista_de_doencas_passadas, final int numero_de_cliente,
			final LinkedList<MembroDoAgregado> lista_de_membros_do_agregado) {

		super(id_pessoa, nome, sexo, bi, data_de_nascimento, nif, email, telefone, telemovel, morada, grupo_sanguineo, codigo_postal,
				lista_de_tratamentos_passados, lista_de_doencas_passadas);

		this.numero_de_cliente = numero_de_cliente;
		this.lista_de_membros_do_agregado = lista_de_membros_do_agregado;
		this.tipo = "cliente";
	}

	public int getNumeroDeCliente() {
		return numero_de_cliente;
	}

	public boolean temMembrosDoAgregado() {
		return !this.lista_de_membros_do_agregado.isEmpty();
	}

	public LinkedList<MembroDoAgregado> getListaDeMembrosDoAgregado() {
		return this.lista_de_membros_do_agregado;
	}

	public void adicionaMembroDoAgregado(final Hashtable<String, Object> dados_membro_do_agregado) throws SQLException, ClassNotFoundException,
			InstantiationException, IllegalAccessException {
		// Inserir na base de dados.
		MembroDoAgregado.insere(dados_membro_do_agregado);

		// Adiciona a instancia do objecto.
		int ultimo_id_inserido = MembroDoAgregado.devolveUltimoIdentificadorDeInsercao();
		MembroDoAgregado membro_do_agregado = MembroDoAgregado.devolve(ultimo_id_inserido);
		this.lista_de_membros_do_agregado.add(membro_do_agregado);
	}

	public void alteraMembroDoAgregado(final Hashtable<String, Object> dados_membro_do_agregado) throws SQLException, ClassNotFoundException,
			InstantiationException, IllegalAccessException {

		// Procura a instancia do objecto.
		int id_pessoa_do_membro_do_agregado = ((Integer) dados_membro_do_agregado.get("id_pessoa"));
		MembroDoAgregado membro_do_agregado = this.getMembroDoAgregado(id_pessoa_do_membro_do_agregado);

		// Altera o objecto.
		membro_do_agregado.setNome((String) dados_membro_do_agregado.get("var_nome"));
		membro_do_agregado.setSexo(((String) dados_membro_do_agregado.get("var_sexo")).charAt(0));
		membro_do_agregado.setBI(((Integer) dados_membro_do_agregado.get("var_bi")));
		membro_do_agregado.setDataDeNascimento(((Date) dados_membro_do_agregado.get("var_data_de_nascimento")));
		membro_do_agregado.setNIF(((Integer) dados_membro_do_agregado.get("var_nif")));
		membro_do_agregado.setEmail(((String) dados_membro_do_agregado.get("var_email")));
		membro_do_agregado.setTelefone(((Integer) dados_membro_do_agregado.get("var_telefone")));
		membro_do_agregado.setTelemovel(((Integer) dados_membro_do_agregado.get("var_telemovel")));
		membro_do_agregado.setMorada(((String) dados_membro_do_agregado.get("var_morada")));
		membro_do_agregado.setGrupoSanguineo(((String) dados_membro_do_agregado.get("var_grupo_sanguineo")));
		membro_do_agregado.setCodigoPostal(CodigoPostal.devolve(((Integer) dados_membro_do_agregado.get("var_id_codigo_postal"))));

		// Invoca o metodo gravaParaBaseDeDados para gravar o objecto.
		membro_do_agregado.gravaParaBaseDeDados();
	}

	public MembroDoAgregado getMembroDoAgregado(final int id_membro_do_agregado) {
		// Procura o membro do agregado associado ao identificador.
		Iterator<MembroDoAgregado> iterator = lista_de_membros_do_agregado.iterator();
		while (iterator.hasNext()) {
			MembroDoAgregado membro_do_agregado = iterator.next();
			if (membro_do_agregado.equals(id_membro_do_agregado))
				return membro_do_agregado;
		}

		// Se o Membro do Agregado nao foi encontrado devolve null.
		return null;
	}

	public void removeMembroDoAGregado(final int id_membro_do_agregado) throws SQLException, ClassNotFoundException, InstantiationException,
			IllegalAccessException {
		// Remove da instancia do objecto
		Iterator<MembroDoAgregado> iterator = lista_de_membros_do_agregado.iterator();
		boolean encontrou_membro_do_agregado = false;
		while (iterator.hasNext() && !encontrou_membro_do_agregado) {
			if (iterator.next().equals(id_membro_do_agregado)) {
				iterator.remove();
				encontrou_membro_do_agregado = true;
			}
		}

		// Remove do local de persistencia
		MembroDoAgregado.remove(id_membro_do_agregado);
	}

	public static void insereParticular(final Hashtable<String, Object> dados_cliente_particular) throws SQLException, ClassNotFoundException,
			InstantiationException, IllegalAccessException {

		// Inserir na base de dados - Pessoa.
		Pessoa.insere(dados_cliente_particular);

		// Inserir na base de dados - Cliente
		int ultimo_id_inserido = Pessoa.devolveUltimoIdentificadorDeInsercao();

		AcessoBD acesso_bd = new AcessoBD();
		acesso_bd.carregaDriverEAbreLigacao();
		String qryName = new String("inserir_cliente_particular");
		dados_cliente_particular.put("var_id_pessoa", new Integer(ultimo_id_inserido));
		acesso_bd.executaUpdate(qryName, dados_cliente_particular);
		acesso_bd.fechaLigacao();
	}

	public static void insereEmpresa(final Hashtable<String, Object> dados_cliente_empresa) throws SQLException, ClassNotFoundException,
			InstantiationException, IllegalAccessException {

		// Inserir na base de dados - Pessoa.
		Pessoa.insere(dados_cliente_empresa);

		// Inserir na base de dados - Cliente
		int ultimo_id_inserido = Pessoa.devolveUltimoIdentificadorDeInsercao();

		AcessoBD acesso_bd = new AcessoBD();
		acesso_bd.carregaDriverEAbreLigacao();
		String qryName = new String("inserir_cliente_empresa");
		dados_cliente_empresa.put("var_id_pessoa", ultimo_id_inserido);
		acesso_bd.executaUpdate(qryName, dados_cliente_empresa);
		acesso_bd.fechaLigacao();

	}

	public static void remove(final int id_pessoa) throws SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException {
		// Remove da base de dados - Pessoa.
		Pessoa.remove(id_pessoa);

		// Remove da base de dados - Cliente.
		AcessoBD acesso_bd = new AcessoBD();
		acesso_bd.carregaDriverEAbreLigacao();
		String qryName = new String("remover_cliente");
		Hashtable<String, Object> dados_da_pessoa = new Hashtable<String, Object>();
		dados_da_pessoa.put("var_id_pessoa", new Integer(id_pessoa));

		acesso_bd.executaUpdate(qryName, dados_da_pessoa);
		acesso_bd.fechaLigacao();
	}

	public void gravaParaBaseDeDados() throws SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException {
		super.gravaParaBaseDeDados();
	}

	public String getTipo() {
		return "cliente base";
	}
        

	protected int numero_de_cliente;
	protected LinkedList<MembroDoAgregado> lista_de_membros_do_agregado;
	protected String tipo;

	public static final String PARTICULAR = "particular";
	public static final String EMPRESA = "empresa";
}
